﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Compression;
using System.Data;

namespace BF.Common
{
    /// <summary>
    /// 生成Grid++报表数据
    /// </summary>
    public class ReportData
    {
        /// <summary>
        /// 根据DataSet, 产生提供给报表生成需要的XML数据
        /// </summary>
        /// <param name="DataPage">将XML数据输出到的Page对象</param>
        /// <param name="myds">待生成XML数据的DataSet对象</param>
        /// <param name="ToCompress">指定是否压缩数据</param>
        public static void GenNodeXmlData(System.Web.UI.Page DataPage, DataSet myds, bool ToCompress)
        {
            if (ToCompress)
            {
                //将string数据转换为byte[]，以便进行压缩
                //System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();
                System.Text.UTF8Encoding converter = new System.Text.UTF8Encoding();
                byte[] XmlBytes = converter.GetBytes(myds.GetXml());

                //在 HTTP 头信息中写入报表数据压缩信息
                DataPage.Response.AppendHeader("gr_zip_type", "deflate");                  //指定压缩方法
                DataPage.Response.AppendHeader("gr_zip_size", XmlBytes.Length.ToString()); //指定数据的原始长度
                DataPage.Response.AppendHeader("gr_zip_encode", converter.HeaderName);     //指定数据的编码方式 utf-8 utf-16 ...

                // 把压缩后的xml数据发送给客户端
                DeflateStream compressedzipStream = new DeflateStream(DataPage.Response.OutputStream, CompressionMode.Compress, true);
                compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length);
                compressedzipStream.Close();
            }
            else
            {
                // 把xml对象发送给客户端
                //DataPage.Response.ContentType = "text/xml";
                DataPage.Response.Write(myds.GetXml());
            }
        }

        /// <summary>
        /// 根据DataTable, 产生提供给报表生成需要的XML数据
        /// </summary>
        /// <param name="DataPage">将XML数据输出到的Page对象</param>
        /// <param name="mydt">待生成XML数据的DataTable对象</param>
        /// <param name="ToCompress">指定是否压缩数据</param>
        public static void GenNodeXmlData(System.Web.UI.Page DataPage, DataTable mydt, bool ToCompress)
        {
            DataSet ds = new DataSet();
            ds.Tables.Add(mydt);
            GenNodeXmlData(DataPage, ds, ToCompress);
        }

        /// <summary>
        /// 根据DataSet, 产生提供给报表生成需要的XML数据，并同时将ParamterPart中的报表参数数据一起打包，参数ToCompress指定是否压缩数据
        /// </summary>
        /// <param name="DataPage">将XML数据输出到的Page对象</param>
        /// <param name="myds">待生成XML数据的DataTable对象</param>
        /// <param name="ParameterPart">报表参数数据</param>
        /// <param name="ToCompress">指定是否压缩数据</param>
        public static void GenEntireReportData(System.Web.UI.Page DataPage, DataSet myds, ref string ParameterPart, bool ToCompress)
        {
            string RecordsetPart = myds.GetXml();
            string Xml = "<report>\r\n" + RecordsetPart + ParameterPart + "</report>";

            if (ToCompress)
            {
                //将string数据转换为byte[]，以便进行压缩
                //System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();
                System.Text.UTF8Encoding converter = new System.Text.UTF8Encoding();
                byte[] XmlBytes = converter.GetBytes(Xml);

                //在 HTTP 头信息中写入报表数据压缩信息
                DataPage.Response.AppendHeader("gr_zip_type", "deflate");                  //指定压缩方法
                DataPage.Response.AppendHeader("gr_zip_size", XmlBytes.Length.ToString()); //指定数据的原始长度
                DataPage.Response.AppendHeader("gr_zip_encode", converter.HeaderName);     //指定数据的编码方式 utf-8 utf-16 ...

                // 把压缩后的xml数据发送给客户端
                DeflateStream compressedzipStream = new DeflateStream(DataPage.Response.OutputStream, CompressionMode.Compress, true);
                compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length);
                compressedzipStream.Close();
            }
            else
            {
                // 把xml对象发送给客户端
                //DataPage.Response.ContentType = "text/xml";
                DataPage.Response.Write(Xml);
            }
        }

        /// <summary>
        /// 将 DataReader 中的数据打包为报表需要的参数数据包形式
        /// </summary>
        /// <param name="drParamer">待生成XML数据的IDataReader对象</param>
        /// <returns>报表需要的参数数据包</returns>
        public static string GenParameterData(IDataReader drParamer)
        {
            string ParameterPart = "\r\n<_grparam>\r\n";
            if (drParamer.Read())
            {
                for (int i = 0; i < drParamer.FieldCount; ++i)
                {
                    ParameterPart += String.Format("<{0}>{1}</{0}>\r\n", drParamer.GetName(i), drParamer.GetValue(i).ToString());
                }
            }
            ParameterPart += "</_grparam>\r\n";
            drParamer.Close();
            drParamer.Dispose();
            return ParameterPart;
        }

        /// <summary>
        /// 根据IDataReader, 产生提供给报表生成需要的XML数据，其中的空值字段也会产生XML节点，参数ToCompress指定是否压缩数据
        /// </summary>
        /// <param name="DataPage">将XML数据输出到的Page对象</param>
        /// <param name="dr">待生成XML数据的IDataReader对象</param>
        /// <param name="ToCompress">指定是否压缩数据</param>
        public static void GenNodeXmlDataFromReader(System.Web.UI.Page DataPage, IDataReader dr, bool ToCompress)
        {
            string XMLText = "<xml>\n";
            while (dr.Read())
            {
                XMLText += "<row>";
                //foreach (IGRField fld in Report.DetailGrid.Recordset.Fields)
                for (int i = 0; i < dr.FieldCount; ++i)
                {
                    string FldName = dr.GetName(i);
                    if (FldName == "")
                        FldName = "Fld" + i;
                    XMLText += String.Format("<{0}>{1}</{0}>", FldName, dr.GetValue(i));
                }
                XMLText += "</row>\n";
            }
            XMLText += "</xml>\n";

            dr.Close();
            dr.Dispose();

            if (ToCompress)
            {
                //将string数据转换为byte[]，以便进行压缩
                System.Text.UTF8Encoding converter = new System.Text.UTF8Encoding();
                byte[] XmlBytes = converter.GetBytes(XMLText);

                //在 HTTP 头信息中写入报表数据压缩信息
                DataPage.Response.AppendHeader("gr_zip_type", "deflate");                  //指定压缩方法
                DataPage.Response.AppendHeader("gr_zip_size", XmlBytes.Length.ToString()); //指定数据的原始长度
                DataPage.Response.AppendHeader("gr_zip_encode", converter.HeaderName);     //指定数据的编码方式 utf-8 utf-16 ...

                // 把压缩后的xml数据发送给客户端
                DeflateStream compressedzipStream = new DeflateStream(DataPage.Response.OutputStream, CompressionMode.Compress, true);
                compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length);
                compressedzipStream.Close();
            }
            else
            {
                // 把xml对象发送给客户端
                //DataPage.Response.ContentType = "text/xml";
                DataPage.Response.Write(XMLText);
            }
        }
    }
}
